/**
 * node.js 自动化部署脚本
 * 需要dev下安装compressing与sh2
 */

const compressing = require('compressing')
const ssh2 = require('ssh2')

const config = {
    context: 'atlas-docs',//服务上下文名称
    path: {
        // 远程地址
        romotePath: '/mnt/application/nginx-pxy'
    },
    server: {
        host: '123.156.78.110', // 服务器地址
        port: 6666, // 端口号
        username: 'root', // 用户名
        password: 'root-2023' // 密码
    },
    locDirname: 'dist-outer' // 被上传的目录名
}

// 上传操作
let connect = new ssh2.Client();
function conn() { // 连接服务器
    console.log('*******连接服务器*******')
    connect.on('ready', () => {
        console.log('*******上传文件中*******')
        upload()
    }).on('error', (err) => {
        console.error(err)
        console.log('*******连接出错*******')
    }).on('end', () => {
        console.log('*******连接关闭*******')
    }).on('close', (err) => {
        if (err) {
            console.log('*******连接出错*******')
        }
    }).connect(config.server)
}

function upload() { // 上传文件
    connect.sftp((err, sftp) => {
        if (err) throw err
        // 第一个参数为要上传的文件名, 第二个参数为服务器目录或下面的文件名
        sftp.fastPut(config.context + '.zip', config.path.romotePath + '/' + config.context + '.zip', (err, res) => {
            if (err) {
                console.log(err)
                console.error('*******上传失败*******')
                connect.end()
                return
            }
            console.log('*******上传成功*******')
            unzipShell()
        })
    })
}

function unzipShell() {
    connect.shell((err, stream) => {
        console.log('*******开始解压*******')
        if (err) throw err
        let buf = "";
        stream.on('close', err => {
            connect.end()
            if (err) {
                console.error(err)
                return
            }
            console.info('******* SUCCESS!! *******')
        }).on('data', data => {
            buf += data
            console.log(buf)
        })

        stream.write('cd ' + config.path.romotePath + ' \n')
        stream.write('rm -rf ' + config.context + ' \n')
        stream.write('unzip ' + config.context + '.zip \n')
        // stream.write('mv dist-outer ' + config.context + ' \n')
        stream.write(`mv ${config.locDirname} ${config.context} \n`)
        stream.write('rm -rf ' + config.context + '.zip \n')
        stream.write('exit \n')
    })
}

function compress() { // 压缩命令
    console.log('********开始压缩********')
    // 此处第一个参数为要打包的目录, 第二个参数是打包后的文件名
    compressing.zip.compressDir(config.locDirname + '/', config.context + '.zip').then(() => {
        console.log('*******压缩成功*******')
        conn()
    })
}

compress()
